package xfuzzy.alg_genetico.indeterminado.xfghlOld.model;

public class XfghlExhaustiveGeneration {

	
	/**
	 * Genera una poblaci�n exhaustiva
	 * @param numVar
	 * @return
	 */
	public static XfghlGeneration getExhaustiveGeneration(XfghlConfig config)
	{
		//Poblaci�n que va a contener a todos los cromosomas posibles
		XfghlGeneration gen=new XfghlGeneration(config,false);
		
		//Inicializamos el cromosoma con el mayor posible
/*		int [] aChromosome=new int[config.getNumVarEnt()-2]; 		
		for(int i=0;i<aChromosome.length;i++){
			
			aChromosome[i]=0;
		}*/
				
		//Numero total de chromosomas a crear
		//int numStructures=numEstructuras(config.getNumVarEnt());
		
		//Indice para crear los distintos cromosomas
		//int indice=aChromosome.length-1; 		
		
		
		/*
		//Generamos todos los cromosomas
		for(int struct=0;struct<numStructures;struct++)
		{
			//A�adimos el cromosoma
			gen.addChromosome(new XfghlChromosome(config,aChromosome.clone(),struct));
		
			System.out.println(gen.getChromosome(struct).toString());
			//Modificamos un gen en el cromosoma
			if(aChromosome[indice]==numConexionesNVar(indice)-1)
			{
				//Decrementamos indice porque ya han sido todos generados
				indice--;
			}
			aChromosome[indice]++;			
		}*/
		
		
		int contador=0;
		for(int i=0;i<numConexionesNVar(0)-1;i++)
		{
			for(int j=0;j<numConexionesNVar(1)-1;j++)
			{
				for(int k=0;k<numConexionesNVar(2)-1;k++)
				{
			     	for(int l=0;l<numConexionesNVar(3)-1;l++)
					{
			     							
						for(int m=0;m<numConexionesNVar(4)-1;m++)
						{
							for(int n=0;n<numConexionesNVar(5)-1;n++)
							{
								for(int o=0;o<numConexionesNVar(6)-1;o++)
								{
									contador++;
									//int [] aChromosome={i,j,k,l,m,n};
									int [] aChromosome={i,j,k,l,m,n,o};
									//int [] aChromosome={i,j,k,l,m};
									//int [] aChromosome={i,j,k,l};
									//int [] aChromosome={i,j,k};
									//int [] aChromosome={i,j};
									gen.addChromosome(new XfghlChromosome(config,aChromosome,contador));
									//System.out.println(contador+". NumPob: "+numEstructuras(config.getNumVarEnt()));
								}
							}
						}
					}
				}
			}
		}
		
		return gen;
	}
	
	/**
	 * Calcula el n�mero de conexiones para una posici�n del cromosoma
	 * @param pos �ndice del array
	 * @return n�mero de conexiones
	 */
	private static int numConexionesNVar(int pos)
	{
		return (2*(pos+2));
	}
	
	/**
	 * M�todo est�tico que calcula el n�mero de estructuras jer�rquica diferentes con un m�mero de variables
	 * @param nVar N�mero de variables de entrada
	 * @return El n�mero de estructuras
	 */
	public static int numEstructuras(int nVar)
	{
		if(nVar==2)
			return 1;
		else
			return numEstructuras(nVar-1)*(2*nVar-3);
	}
}
